package com.arpa.wms.service;

import com.arpa.wms.domain.dto.ContractDTO;
import com.arpa.wms.domain.dto.ContractSchedulingInventoryDTO;
import com.arpa.wms.domain.entity.Contract;
import com.arpa.wms.domain.entity.ContractOperationCost;
import com.arpa.wms.domain.vo.ContractVO;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.scheduling.annotation.Async;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.concurrent.Future;

/**
 * <p>
 * 仓库计费合同 服务类
 * </p>
 *
 * @author LEO
 * @since 2020-11-17
 */
public interface IContractService extends IService<Contract> {

    /**
     * 保存
     * @param entity
     * @return
     */
    @Override
    boolean save(Contract entity);

    /**
     * 根据code更新实体
     * @param entity
     * @return
     */
    boolean updateByCode(Contract entity);

    /**
     * 查询列表
     * @param contractDTO
     * @return
     */
    List<ContractVO> queryList(ContractDTO contractDTO);

    /**
     * 查询合计,包含总数
     * @param contractDTO
     * @return
     */
    ContractVO queryListSum(ContractDTO contractDTO);

    /**
     * 计费合同启用
     * @param codes 合同标识
     * @return
     */
    int activeStatus(List<String> codes);


    /**
     * 零仓合同生成计费排期
     * @param contractSchedulingInventoryDTO 入库商品
     */
    @Async
    @Transactional(rollbackFor = Exception.class)
    void scatteredGenerateBillingSchedule(final ContractSchedulingInventoryDTO contractSchedulingInventoryDTO);

    /**
     * 计费合同停用
     * @param codes 合同标识
     * @return
     */
    int unactiveStatus(List<String> codes);



    /**
     * 启用合同
     * @param code 合同标识
     */
    Future<Boolean> active(String code,String groupCode);

    /**
     * 停用合同
     * @param code 合同标识
     */
    Future<Boolean> unactive(String code,String groupCode);



    /**
     * 获取合同详情
     * @param code 合同标识
     * @return
     */
    ContractVO getContract(String code);



    /**
     * 查询仓储合同作业费明细
     * @param contractCode 合同标识
     * @return
     */
    List<ContractOperationCost> getContractOperationCosts(String contractCode);

    /**
     * 通过code删除合同信息
     * 同时删除合同作业费
     * 同时删除合同计费排期
     * @param code 合同标识
     */
    void remove(String code);

    /**
     * 获取机构下有效合同
     * @param branchCode 机构code
     * @return
     */
    List<Contract> queryEffective(String branchCode);
}
